package com.guli.gulimall.product.service.impl;

import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.guli.common.utils.PageUtils;
import com.guli.common.utils.Query;

import com.guli.gulimall.product.dao.CategoryDao;
import com.guli.gulimall.product.entity.CategoryEntity;
import com.guli.gulimall.product.service.CategoryService;



@Service("categoryService")
public class CategoryServiceImpl extends ServiceImpl<CategoryDao, CategoryEntity> implements CategoryService {

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<CategoryEntity> page = this.page(
                new Query<CategoryEntity>().getPage(params),
                new QueryWrapper<CategoryEntity>()
        );

        return new PageUtils(page);
    }

    @Override
    public List<CategoryEntity> treelist() {
        // 1.因为和数据库交互次数过多所以导致效率过低 要降低数据库访问频率
        List<CategoryEntity> allList = baseMapper.selectList(null);
        // 2.剩下的所有业务 都交给jdk
        //   2.1 查询所以的一级分类
        // stream  变成流的形式
        // filter  过滤
        // item    就是集合中的每一个元素
        // map     对每一个的结果整合处理
        List<CategoryEntity> l1List = allList.stream().filter(item -> {
            return item.getParentCid().equals(0L); //返回的结果就是一级分类
        }).map(l1 -> {
            // 根据l1去 allList查询每个l1对应的二级分类
            List<CategoryEntity> l2List = getChildren(allList, l1);
            l1.setChildren(l2List);
            return l1;
        }).sorted((s1,s2)->{
            return (s1.getSort() != null?s1.getSort():0) - (s2.getSort() != null?s2.getSort():0);
        }).collect(Collectors.toList());
        return l1List;
    }

    private List<CategoryEntity> getChildren(List<CategoryEntity> allList,CategoryEntity category){
        List<CategoryEntity> collect = allList.stream().filter(item -> {
            return item.getParentCid().equals(category.getCatId());
        }).map(cate -> {
            List<CategoryEntity> children = getChildren(allList, cate);
            cate.setChildren(children);
            return cate;
        }).sorted((s1,s2)->{
            return (s1.getSort() != null?s1.getSort():0) - (s2.getSort() != null?s2.getSort():0);
        }).collect(Collectors.toList());
        return collect;
    }

//    @Override //垃圾代码
//    public List<CategoryEntity> treelist() {
//        //第一种查询三级分类的方法
//        //   1.查询所以的一级分类
//        QueryWrapper<CategoryEntity> w1 = new QueryWrapper<>();
//        w1.eq("parent_cid",0);
//        //和数据库第一次交互
//        List<CategoryEntity> l1list = baseMapper.selectList(w1);
//        //   2.遍历所有的一级分类查询二级分类
//        // 循环N次
//        for (CategoryEntity l1 : l1list){
//            QueryWrapper<CategoryEntity> w2 = new QueryWrapper<>();
//            w2.eq("parent_cid",l1.getCatId());
//            // 查询到了每个一级分类对应的二级分类
//            //  循环N次
//            List<CategoryEntity> l2list = baseMapper.selectList(w2);
//            //  需要把每个二级分类放置到每个一级分类中
//            l1.setChildren(l2list);
//        //   3.遍历每个二级分类查询三级分类
//            for (CategoryEntity l2: l2list){
//                QueryWrapper<CategoryEntity> w3 = new QueryWrapper<>();
//                w3.eq("parent_cid",l2.getCatId());
//                List<CategoryEntity> l3list = baseMapper.selectList(w3);
//                l2.setChildren(l3list);
//            }
//        }
//        return l1list;
//    }

}